iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0

今天要做一個文章元件 來處理點擊後顯示的頁面

咒語:幫我做一個文章顯示頁面元件 根據點擊的id 用Mui顯示 title 跟content

import React from "react";
import { Typography, Paper, Container } from "@mui/material";

const Article = ({ articleData, selectedArticleId, onBack }) => {
  // 找到被選擇的文章

  const selectedArticle = articleData.find(
    (article) => article.id === selectedArticleId
  );

  if (!selectedArticle) {
    return (
      <Container maxWidth="md">
        <Typography variant="h4">選擇一篇文章查看</Typography>
        {selectedArticleId}
      </Container>
    );
  }

  return (
    selectedArticleId && (
      <Container maxWidth="md">
        <Paper sx={{ padding: 3, marginTop: 3 }}>
          <Typography variant="h4">{selectedArticle.title}</Typography>
          <Typography variant="body1" sx={{ marginTop: 2 }}>
            {selectedArticle.content}
          </Typography>
        </Paper>
      </Container>
    )
  );
};

export default Article;

接下來要請他跟昨天的code合併
咒語:與上述code中 TableRow onClick={() => {點擊時切換成Article元件}

就會把昨天的code加入點擊後的邏輯

import React, { useState } from "react";
import {
  AppBar,
  Box,
  Container,
  CssBaseline,
  Paper,
  Tab,
  Tabs,
  Table,
  TableBody,
  TableCell,
  TableContainer,
  TableHead,
  TableRow,
  Typography,
  TablePagination,
} from "@mui/material";

import Article from "../component/article";
const articleData = [
  {
    id: 1,
    title: "React 學習指南",
    content:
      "React 是一個流行的前端 JavaScript 框架,本指南將幫助您入門 React 開發。",
  },
  {
    id: 2,
    title: "Vue.js 與狀態管理",
    content:
      "Vue.js 提供了簡單而有效的狀態管理機制,了解如何在 Vue.js 中管理應用程式的狀態。",
  },
  {
    id: 3,
    title: "JavaScript 非同步編程",
    content:
      "深入了解 JavaScript 中的非同步編程,包括 Promise、async/await 等技術。",
  },
  {
    id: 4,
    title: "前端性能優化技巧",
    content: "優化前端性能是提供出色用戶體驗的關鍵,這裡介紹一些優化技巧。",
  },
  {
    id: 5,
    title: "Webpack 打包工具入門",
    content: "Webpack 是一個功能強大的前端打包工具,這是一個入門指南。",
  },
  {
    id: 6,
    title: "前端安全性指南",
    content: "保護前端應用程式的安全性至關重要,這是一個前端安全性指南。",
  },
  {
    id: 7,
    title: "TypeScript 入門教程",
    content:
      "TypeScript 是 JavaScript 的超集,了解如何使用 TypeScript 進行開發。",
  },
  {
    id: 8,
    title: "前端框架比較:React、Angular 和 Vue",
    content: "比較 React、Angular 和 Vue 這三個主要前端框架的特點和優缺點。",
  },
  {
    id: 9,
    title: "响应式設計與 CSS 媒體查詢",
    content: "學習如何使用 CSS 媒體查詢創建具有響應性的網頁設計。",
  },
  {
    id: 10,
    title: "前端測試技術總覽",
    content: "了解前端測試技術,包括單元測試、集成測試和端對端測試。",
  },
  {
    id: 11,
    title: "鐵人賽精華",
    content:
      "「IT邦鐵人賽精華」是一個讓資訊科技專業人士分享他們的專業知識和經驗的平台。這個賽事每年都吸引著眾多的參與者,他們在各種主題下創作出高品質的文章和教學內容。參加IT邦鐵人賽不僅僅是一個展示您技術和專業知識的機會,還能夠與其他業界專家互動和學習。這個賽事有助於促進知識分享和技術交流,並有助於推動整個資訊科技社區的發展。無論您是一名軟件開發者、網站設計師、數據分析師還是任何其他IT領域的專業人士,IT邦鐵人賽都是一個展示您專業知識和技能的理想平台。不僅可以獲得證書和獎勵,還能夠建立寶貴的職業聯繫,並對整個行業做出貢獻。",
  },
];

const Home = () => {
  const [value, setValue] = useState(0);
  const [page, setPage] = useState(0);
  const [rowsPerPage, setRowsPerPage] = useState(10);
  const [selectedArticleId, setSelectedArticleId] = useState(null);

  const handleChangeTab = (event, newValue) => {
    setValue(newValue);
  };

  const handleChangePage = (event, newPage) => {
    setPage(newPage);
  };

  const handleChangeRowsPerPage = (event) => {
    setRowsPerPage(parseInt(event.target.value, 10));
    setPage(0);
  };

  const articlesToDisplay = articleData.slice(
    page * rowsPerPage,
    page * rowsPerPage + rowsPerPage
  );

  return (
    <Container component="main" maxWidth="lg">
      <CssBaseline />

      {selectedArticleId ? (
        <Article
          selectedArticleId={selectedArticleId}
          onBack={() => setValue(0)} // 添加一個返回函數,用於返回文章列表
          articleData={articleData}
        />
      ) : (
        <Box>
          <AppBar position="static" color="default">
            <Tabs
              value={value}
              onChange={handleChangeTab}
              indicatorColor="primary"
              textColor="primary"
              variant="scrollable"
              scrollButtons="auto"
              aria-label="文章分類選擇"
            >
              <Tab label="最新" />
              <Tab label="熱門" />
              <Tab label="已解決" />
            </Tabs>
          </AppBar>
          <Box>
            {/* <Typography variant="h4" gutterBottom>
          {value === 0 ? "最新文章" : value === 1 ? "熱門文章" : "已解決文章"}
        </Typography> */}
            <TableContainer component={Paper}>
              <Table>
                <TableHead>
                  {/* <TableRow>
                <TableCell>文章標題</TableCell>
              </TableRow> */}
                </TableHead>
                <TableBody>
                  {articlesToDisplay.map((article) => (
                    <TableRow
                      key={article.id}
                      hover
                      onClick={() => {
                        // 點擊文章時處理相應的操作,例如顯示文章內容
                        setSelectedArticleId(article.id);
                      }}
                    >
                      <TableCell>{article.title}</TableCell>
                    </TableRow>
                  ))}
                </TableBody>
              </Table>
            </TableContainer>
            <TablePagination
              rowsPerPageOptions={[10, 20, 50]}
              component="div"
              count={articleData.length}
              rowsPerPage={rowsPerPage}
              page={page}
              onPageChange={handleChangePage}
              onRowsPerPageChange={handleChangeRowsPerPage}
            />
          </Box>
        </Box>
      )}
    </Container>
  );
};

export default Home;

發現還欠缺一個回去前頁的按鍵

這裡也請他生成

咒語 請用mui幫我生成一個返回按鍵含icon 並且使用onBack Fn

import React from 'react';
import { IconButton } from '@mui/material';
import ArrowBackIcon from '@mui/icons-material/ArrowBack';

const BackButton = ({ onBack }) => {
  return (
    <IconButton
      onClick={onBack}
      color="primary"
      sx={{ '&:focus': { outline: 'none' } }} // 移除點擊時的黑色圓框
    >
      <ArrowBackIcon />
      返回
    </IconButton>
  );
};

export default BackButton;

把上述元件塞入Article元件中 文章就暫時完成了


上一篇
[Day13]首頁更新 模仿IT 邦
下一篇
[Day15] 購物車頁面
系列文
I have an AI ,I have a React, Ugh ,AI -React 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言